Перейти к основному содержимому

5.05. Иерархия исключений в C#

Разработчику Архитектору

Иерархия исключений в C#

Корневой класс:

  • System.Exception

Основные прямые и косвенные подклассы Exception:

Из пространства имён System:

  • System.ApplicationException — устаревший базовый класс для пользовательских исключений (не рекомендуется к использованию).
  • System.SystemException — базовый класс для всех системных исключений.
    • System.ArgumentException
      • System.ArgumentNullException
      • System.ArgumentOutOfRangeException
    • System.ArithmeticException
      • System.DivideByZeroException
      • System.OverflowException
    • System.ArrayTypeMismatchException
    • System.BadImageFormatException
    • System.CannotUnloadAppDomainException
    • System.ComponentModel.InvalidAsynchronousStateException
    • System.ComponentModel.InvalidEnumArgumentException
    • System.DataMisalignedException
    • System.ExecutionEngineException — устарело (заменено на System.Runtime.InteropServices.SEHException или аналоги).
    • System.FieldAccessException
    • System.FormatException
      • System.UriFormatException
    • System.IndexOutOfRangeException
    • System.InvalidCastException
    • System.InvalidOperationException
      • System.ObjectDisposedException
      • System.Threading.SynchronizationLockException
    • System.IO.IOException
      • System.IO.DirectoryNotFoundException
      • System.IO.DriveNotFoundException
      • System.IO.EndOfStreamException
      • System.IO.FileLoadException
      • System.IO.FileNotFoundException
      • System.IO.PathTooLongException
    • System.MemberAccessException
      • System.FieldAccessException
      • System.MethodAccessException
      • System.MissingMemberException
        • System.MissingFieldException
        • System.MissingMethodException
    • System.NotImplementedException
    • System.NotSupportedException
    • System.NullReferenceException
    • System.OutOfMemoryException
    • System.PlatformNotSupportedException
    • System.RankException
    • System.Reflection.AmbiguousMatchException
    • System.Reflection.InvalidFilterCriteriaException
    • System.Reflection.ReflectionTypeLoadException
    • System.Resources.MissingManifestResourceException
    • System.Runtime.InteropServices.COMException
    • System.Runtime.InteropServices.ExternalException
      • System.Runtime.InteropServices.SEHException
    • System.Security.SecurityException
    • System.StackOverflowException
    • System.Threading.ThreadAbortException — устарело в .NET Core/.NET 5+ (больше не генерируется).
    • System.TimeoutException
    • System.TypeInitializationException
    • System.TypeLoadException
    • System.UnauthorizedAccessException

Из других распространённых пространств имён:

  • System.Net.WebException (в .NET Framework; в .NET Core заменено на System.Net.Http.HttpRequestException)
  • System.Net.Http.HttpRequestException
  • System.Text.DecoderFallbackException
  • System.Text.EncoderFallbackException
  • System.Threading.Tasks.TaskCanceledException

Особенности:

  • Нет checked-исключений: компилятор не требует объявления или перехвата исключений.
  • Исключения времени выполнения: большинство ошибок (например, NullReferenceException, IndexOutOfRangeException) возникают только при выполнении.
  • Платформо-зависимые исключения: например, PlatformNotSupportedException используется в кроссплатформенных API, когда функция недоступна на текущей ОС.
  • Устаревшие исключения: некоторые исключения (например, ApplicationException, ThreadAbortException) сохранены для совместимости, но не используются в современном коде.

Как получить список программно:

Полный список встроенных исключений нельзя получить динамически без анализа метаданных сборок. Однако можно перечислить все типы из mscorlib (или System.Private.CoreLib в .NET Core) с помощью рефлексии:

using System;
using System.Linq;

var exceptionTypes = typeof(object).Assembly
.GetTypes()
.Where(t => t.IsSubclassOf(typeof(Exception)) && !t.IsAbstract)
.OrderBy(t => t.FullName);

foreach (var type in exceptionTypes)
Console.WriteLine(type.FullName);

Этот код выведет все конкретные (не абстрактные) типы исключений из основной сборки среды выполнения.